import pygame
from settings import *
from entity import Entity
from support import *


class Monster(Entity):
    def __init__(self, 怪物名, 初始位置, 精灵组, 障碍精灵组, 玩家受伤,死亡,增加经验值):
        super().__init__(精灵组)
        self.精灵类型 = '怪物'
        self.怪物名 = 怪物名
        self.导入动画视图()
        self.动作 = 'idle'
        # 先随便给一张图片
        # self.image = pygame.image.load(f'../graphics/monsters/{self.怪物名}/idle/0.png')
        self.image = self.动画字典[self.动作][self.动作帧]
        self.rect = self.image.get_rect(topleft=初始位置)
        self.碰撞区域 = self.rect.inflate(0, -10)
        self.障碍精灵组 = 障碍精灵组

        怪物信息 = 怪物库[self.怪物名]
        self.血量值 = 怪物信息['血量值']
        self.经验值 = 怪物信息['经验值']
        self.速度 = 怪物信息['速度']
        self.伤害 = 怪物信息['伤害']
        self.抵抗程度 = 怪物信息['抵抗程度']
        self.攻击半径 = 怪物信息['攻击半径']
        self.视野半径 = 怪物信息['视野半径']
        self.攻击方式 = 怪物信息['攻击方式']

        self.是否可以攻击 = True
        self.开始攻击时间 = None
        self.攻击冷却时间 = 400

        self.玩家受伤 = 玩家受伤
        self.死亡 = 死亡
        self.增加经验值 = 增加经验值

        self.无敌时间 = 300

        # 音效
        self.死亡音效 = pygame.mixer.Sound('../audio/death.wav')
        self.hit_sound = pygame.mixer.Sound('../audio/hit.wav')
        self.attack_sound = pygame.mixer.Sound(怪物信息['攻击音效'])
        self.死亡音效.set_volume(0.6)
        self.hit_sound.set_volume(0.6)
        self.attack_sound.set_volume(0.6)

    def 导入动画视图(self):
        动画路径前缀 = f'../graphics/monsters/{self.怪物名}/'
        self.动画字典 = {'idle': [], 'move': [], 'attack': []}

        for 动画 in self.动画字典.keys():
            完整路径 = 动画路径前缀 + 动画
            self.动画字典[动画] = 导入视图(完整路径)

    def 获取玩家距离和方向(self, player):
        怪物向量 = pygame.math.Vector2(self.rect.center)
        角色向量 = pygame.math.Vector2(player.rect.center)
        距离 = (角色向量 - 怪物向量).magnitude()

        if 距离 > 0:
            方向 = (角色向量 - 怪物向量).normalize()
        else:
            方向 = pygame.math.Vector2()

        return (距离, 方向)

    def 获取动作(self, player):
        距离 = self.获取玩家距离和方向(player)[0]

        if 距离 <= self.攻击半径 and self.是否可以攻击:
            if self.动作 != 'attack':
                self.动作帧 = 0
            self.动作 = 'attack'
        elif 距离 <= self.视野半径:
            self.动作 = 'move'
        else:
            self.动作 = 'idle'

    def 行动(self, player):
        if self.动作 == 'attack':
            self.开始攻击时间 = pygame.time.get_ticks()
            self.玩家受伤(self.伤害, self.攻击方式)
        elif self.动作 == 'move':
            self.方向 = self.获取玩家距离和方向(player)[1]
        else:
            self.方向 = pygame.math.Vector2()

    def 动画(self):
        动作动画 = self.动画字典[self.动作]

        self.动作帧 += self.动画切换速度
        if self.动作帧 >= len(动作动画):
            if self.动作 == 'attack':
                self.是否可以攻击 = False
            self.动作帧 = 0

        self.image = 动作动画[int(self.动作帧)]
        self.rect = self.image.get_rect(center=self.碰撞区域.center)

        if not self.是否可以收到伤害:
            闪烁 = self.伤害闪烁()
            self.image.set_alpha(闪烁)
        else:
            self.image.set_alpha(255)

    def 冷却(self):
        当前时间 = pygame.time.get_ticks()
        if not self.是否可以攻击:
            if 当前时间 - self.开始攻击时间 >= self.攻击冷却时间:
                self.是否可以攻击 = True

        if not self.是否可以收到伤害:
            if 当前时间 - self.伤害开始时间 >= self.无敌时间:
                self.是否可以收到伤害 = True

    def 受到伤害(self, player, 攻击类型):
        if self.是否可以收到伤害:
            self.方向 = self.获取玩家距离和方向(player)[1]
            if 攻击类型 == '武器':
                self.血量值 -= player.武器伤害总和()
            else: # 魔法伤害
                pass
            self.伤害开始时间 = pygame.time.get_ticks()
            self.是否可以收到伤害 = False

    def 是否死亡(self):
        if self.血量值 <= 0:
            self.kill()
            self.死亡(self.rect.center, self.怪物名)
            self.增加经验值(self.经验值)
            self.死亡音效.play()

    def 受伤反应(self):
        if not self.是否可以收到伤害:
            self.方向 *= -self.抵抗程度

    def update(self):
        self.受伤反应()
        self.是否死亡()
        self.移动(self.速度)
        self.动画()
        self.冷却()

    def 怪物更新(self, player):
        self.获取动作(player)
        self.行动(player)
